home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / MacGzip 1.0 / source / Mac / MacGzip.c < prev    next >
C/C++ Source or Header  |  1995-09-18  |  7KB  |  333 lines

  1. /*
  2.  * MacGzip.c
  3.  * (C) SPDsoft, August 16, 1995
  4.  *
  5.  */
  6.  
  7. #if GENERATINGCFM && !defined(__MWERKS__)
  8.     QDGlobals    qd;
  9. #endif
  10. /*
  11.  * THINK_C 8.0 extra includes (Not in MacHeaders)
  12.  */
  13. #include <Aliases.h>
  14.  
  15.  
  16. #include "Prefs.h"
  17. #include "GzErrors.h"
  18. #include "ErrorStrings.h"
  19. #include "FileTypes.h"
  20.  
  21. #include "MacGzip.h"
  22. #include "Globals.h"
  23. #include "MacAE.h"
  24.  
  25. /*
  26.  * Globals for the application
  27.  */
  28.  
  29. PrefsType            gPrefs;
  30. AppStatus            gApp = 
  31.                     {
  32.                         nil,    /* MenuBar */
  33.                         nil,    /* Cursor */
  34.                         TRUE,    /* StartupFiles */
  35.                         FALSE,    /* PrefsChanged */
  36.                         FALSE,    /* Working */
  37.                         TRUE,    /* InForeground */
  38.                         FALSE,    /* quit */
  39.                         FALSE,    /* Prompt */
  40.                         0,        /* KeysMode */
  41.                         0,        /* KeysOp */
  42.                         0,        /* Op */
  43.                         nil        /* DFolder */
  44.                     };
  45.                     
  46. TSufMap                gSufMap = 
  47.                                 {
  48.                                     0, nil,
  49.                                     nil, nil
  50.                                 };
  51.  
  52.  
  53. /*
  54.  * Prototypes
  55.  */
  56.  
  57. void    about(void);
  58.  
  59. static void InitTheMac(void);
  60. static void FlushTheMac(void);
  61.  
  62.  
  63. static    void    CenterPicRect(PicHandle thePic, Rect *inRect, Rect *outRect);
  64. static    pascal char MyFilter ( DialogPtr, EventRecord*, short* );
  65.  
  66.  
  67. extern Boolean DoPrefsDialog(PrefsTypePtr thePrefs, AliasHandle * theFldrAlias);
  68.  
  69. /*
  70.  * main
  71.  */
  72.  
  73. void    main( void )
  74. {
  75.     InitTheMac();
  76.     
  77.         while (!EventLoop())
  78.         ;
  79.     FlushTheMac();
  80. }
  81.  
  82.  
  83. /******************************************************************************
  84.  *
  85.  * local functions
  86.  */
  87.  
  88. static void InitTheMac(void)
  89. {
  90.     long    gestAEResponse,
  91.             gFindFolderResponse,
  92.             gestAliasResponse,
  93.             gestFSResponse,
  94.             gestStdFileResponse;
  95.     
  96.     SysEnvRec    theWorld;
  97.  
  98.     AEEventHandlerUPP    gMyHandleODoc;
  99.     AEEventHandlerUPP    gMyHandleOApp;
  100.     AEEventHandlerUPP    gMyHandlePDoc;
  101.     AEEventHandlerUPP    gMyHandleQuit;
  102.  
  103.     FlushEvents(everyEvent, 0);
  104.     InitGraf(&qd.thePort);
  105.     InitFonts();
  106.     InitWindows();
  107.     InitMenus();
  108.     TEInit();
  109.     InitDialogs(0L);
  110.     InitCursor();
  111.     MaxApplZone();
  112.     MoreMasters();
  113.     MoreMasters();
  114.     
  115.     err = noErr;
  116.  
  117.     /*
  118.      * sys 7 ?
  119.      */
  120.  
  121.     if ( noErr == (err = Gestalt(gestaltAppleEventsAttr, &gestAEResponse)))
  122.     
  123.     if ( noErr == (err = Gestalt(gestaltFindFolderAttr,&gFindFolderResponse)))
  124.  
  125.     if ( noErr == (err = Gestalt(gestaltAliasMgrAttr, &gestAliasResponse)))
  126.     
  127.     if ( noErr == (err = Gestalt(gestaltFSAttr, &gestFSResponse)))
  128.     
  129.         err = Gestalt(gestaltStandardFileAttr, &gestStdFileResponse);
  130.     
  131.     if (
  132.         (
  133.         ( err != noErr ) ||
  134.         ((gestAEResponse >> gestaltAppleEventsPresent) & 0x0001) == 0 ||
  135.         (gFindFolderResponse & ( 1 << gestaltFindFolderPresent)) == 0 ||
  136.         (gestAliasResponse & (1 << gestaltAliasMgrPresent)) == 0 ||
  137.         (gestFSResponse & (1 << gestaltHasFSSpecCalls)) == 0 ||
  138.         (gestStdFileResponse & (1 << gestaltStandardFile58)) == 0
  139.         
  140.         ) ||
  141.         (SysEnvirons(curSysEnvVers, &theWorld) != noErr)
  142.     )
  143.     {
  144.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(GENERIC, OLD_SYSTEM));
  145.     }
  146.         
  147.     gApp.hasColorQD = theWorld.hasColorQD;
  148.         
  149.     /*
  150.      * Get prefs
  151.      */
  152.      
  153.     if (!GetOrGeneratePrefs(&gPrefs, &gApp.DFolder, kCurrentPrefsTypeVers))
  154.     {
  155.         /*
  156.          * First time
  157.          */
  158.         about();
  159.         
  160.         if (DoPrefsDialog(&gPrefs, &gApp.DFolder))
  161.         {
  162.             if( ( err = SavePrefs( &gPrefs, &gApp.DFolder )) != noErr )
  163.             {
  164.                     DoError(SYS_ERR,QUIT_ERR,GetErrFmt(GENERIC, CANT_SAVE_PREF));
  165.             }
  166.         }
  167.         else
  168.         /*
  169.          * The user MUST hit OK the first time...
  170.          */
  171.             ExitToShell();
  172.     }
  173.  
  174.             
  175.     if ( gPrefs.Compress.IC || gPrefs.Decompress.IC )
  176.         if ( InitICMappings( &(gSufMap.ICinst), &(gSufMap.ICmappings) ) )
  177.         {
  178.             /* couldn't init it */
  179.             gPrefs.Compress.IC = gPrefs.Decompress.IC = FALSE;
  180.             DoError(NO_ERR,INFO_ERR,GetErrFmt(GENERIC, CANT_GET_IC));
  181.         }
  182.         
  183.     if ( gPrefs.Decompress.Fetch )
  184.         if ( InitFetchMappings( &(gSufMap.FPrefsSize), &(gSufMap.FPrefs) ) )
  185.         {
  186.             /* couldn't init it */
  187.             gPrefs.Decompress.Fetch = FALSE;
  188.             DoError(NO_ERR,INFO_ERR,GetErrFmt(GENERIC, CANT_GET_FETCH));
  189.         }
  190.         
  191.     
  192.     /*
  193.      * Install Apple Event Handlers
  194.      */
  195.  
  196.     gMyHandleODoc = NewAEEventHandlerProc (MyHandleODoc);
  197.     gMyHandleOApp = NewAEEventHandlerProc (MyHandleOApp);
  198.     gMyHandlePDoc = NewAEEventHandlerProc (MyHandlePDoc);
  199.     gMyHandleQuit = NewAEEventHandlerProc (MyHandleQuit);
  200.     
  201.     if ( noErr == (err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, gMyHandleODoc,0, FALSE) ))
  202.     if ( noErr == (err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, gMyHandleOApp,0, FALSE) ))
  203.     if ( noErr == (err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, gMyHandlePDoc,0, FALSE) ))
  204.         err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, gMyHandleQuit,0, FALSE);
  205.  
  206.     if ( err != noErr )
  207.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(GENERIC, AE_INSTALL));
  208.  
  209.  
  210.     /*
  211.      * GetResources
  212.      */    
  213.     if ( nil == ( gApp.Cursor = InitAnimatedCursor ( kCalCursorRes )))
  214.     {
  215.         if ( noErr == (err = ResError()))
  216.             err = resFNotFound;
  217.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(RES_MANAGER, RES_NOTFOUND));
  218.     }
  219.  
  220.     ClearMenuBar();
  221.     if ( nil == (gApp.MenuBar = GetNewMBar( kMainMBAR_ID )))
  222.     {
  223.         if ( noErr == (err = ResError()))
  224.             err = resFNotFound;
  225.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(RES_MANAGER, RES_NOTFOUND));
  226.     }
  227.     SetMenuBar(gApp.MenuBar);
  228.     AddResMenu(GetMHandle(kAppleMenu), 'DRVR');
  229.     DrawMenuBar();
  230.     
  231.  
  232. }
  233.  
  234. static void FlushTheMac(void)
  235. {
  236.  
  237.     DisposeICMappings( &gSufMap.ICinst, &gSufMap.ICmappings );
  238.     DisposeFetchMappings( &gSufMap.FPrefsSize, &gSufMap.FPrefs );
  239.  
  240.     ReleaseAnimatedCursor(&gApp.Cursor);
  241.     DisposeHandle(gApp.MenuBar);
  242.     
  243.     if (gApp.PrefsChanged)
  244.         if( ( err = SavePrefs( &gPrefs, &gApp.DFolder )) != noErr )
  245.             DoError(SYS_ERR,WARN_ERR,GetErrFmt(GENERIC, CANT_SAVE_PREF));
  246.         
  247. }
  248.  
  249.  
  250. /***************************************************************************
  251.  *
  252.  * About, Beep and other things
  253.  */
  254.  
  255. void   about( void )
  256. {
  257.     GrafPtr                savePort;
  258.     DialogPtr            DlgPtr;
  259.     short                itemHit;
  260.     short                itemType;
  261.     Handle                itemHandle;
  262.     Rect                itemRect;
  263.  
  264.     PicHandle            thePict;
  265.     ModalFilterUPP        ModalUPP;
  266.  
  267.     if ( nil == (DlgPtr = GetNewDialog(kAboutDLOG_ID, nil, (WindowPtr) -1)))
  268.     {
  269.         if ( noErr == (err = ResError())) err = resFNotFound;
  270.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(RES_MANAGER, RES_NOTFOUND));
  271.     }
  272.  
  273.     ShowWindow(DlgPtr);           
  274.     SelectWindow(DlgPtr);         
  275.  
  276.     GetPort(&savePort);
  277.     SetPort(DlgPtr);
  278.  
  279.     GetDialogItem(DlgPtr, kAboutRect, &itemType, &itemHandle, &itemRect);
  280.     
  281.     if ( nil == ( thePict = (PicHandle) GetResource('PICT', kAboutPICT_ID)))
  282.     {
  283.         if ( noErr == (err = ResError()))
  284.             err = resFNotFound;
  285.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(RES_MANAGER, RES_NOTFOUND));
  286.     }
  287.     
  288.     
  289.     CenterPicRect( thePict, &itemRect, &DlgPtr->portRect);
  290.     DrawPicture(thePict,&itemRect);
  291.  
  292.     ModalDialog (ModalUPP = NewModalFilterProc (MyFilter), &itemHit);
  293.  
  294.     EraseRect (&DlgPtr->portRect);
  295.     ReleaseResource((Handle)thePict);
  296.     
  297.     if ( nil == ( thePict = (PicHandle) GetResource('PICT', kGPLPICT_ID)))
  298.     {
  299.         if ( noErr == (err = ResError()))
  300.             err = resFNotFound;
  301.         DoError(SYS_ERR,QUIT_ERR,GetErrFmt(RES_MANAGER, RES_NOTFOUND));
  302.     }
  303.  
  304.     CenterPicRect( thePict, &itemRect, &DlgPtr->portRect);
  305.     DrawPicture(thePict,&itemRect);
  306.  
  307.     ModalDialog (ModalUPP, &itemHit);
  308.     DisposeRoutineDescriptor (ModalUPP);
  309.  
  310.     ReleaseResource((Handle)thePict);
  311.  
  312.     SetPort(savePort);
  313.     DisposDialog(DlgPtr);  
  314. }  
  315.                                     
  316. static void CenterPicRect(PicHandle thePic, Rect *inRect, Rect *outRect)
  317. {
  318.     short        dh,dv;
  319.     
  320.     *inRect = (*thePic)->picFrame;
  321.     dh = (outRect->right - (inRect->right - inRect->left)) / 2;
  322.     dv = (outRect->bottom - (inRect->bottom - inRect->top)) / 2;
  323.     OffsetRect(inRect,dh,dv);
  324. }
  325.  
  326. static pascal char
  327.     MyFilter ( DialogPtr theDialog, EventRecord *theEvent, short *itemHit)
  328. {
  329.     return ((theEvent->what == keyDown)||(theEvent->what == mouseDown));
  330. }
  331.  
  332.  
  333.